package behavioral_pattern.iterator_pattern;

import java.util.ArrayList;
import java.util.List;

/**
 * 迭代器模式
 *
 * 定义：
 * 提供一种方法来访问聚合对象，而不用暴露这个对象的内部表示，其别名为游标
 * 迭代器模式是一种对象行为型模式。
 *
 * 优点：
 * 1.支持以不同的方式遍历一个聚合对象，在同一个聚合对象上可以定义多种遍历方式。
 * 2.迭代器简化了聚合类。
 * 3. 在迭代器模式中，由于引入了抽象层，增加新的聚合类和迭代器类都很方便，无须修改原有代码。满足开闭原则的要求。
 *
 * 缺点：
 * 1。由于迭代器模式将存储数据和遍历数据的职责分离，增加新的聚合类需要对应增加新的迭代器类，类的个数成对增加，这在一定程度上增加了系统的复杂性。
 * 2.抽象迭代器的设计难度较大，需要充分考虑到系统将来的扩展。
 *
 * 适用场景：
 * 1.访问一个聚合对象的内容无须暴露他的内部表示。
 * 2.需要为一个聚合对象提供多种遍历方式。
 * 3.为遍历不同的聚合结构提供一个统一的接口。
 */
public class MainIterator {

    public static void main(String[] args) {
        List products = new ArrayList();
        products.add("倚天剑");
        products.add("屠龙刀");
        products.add("断肠草");

        AbstractObjectList list;
        AbstractIterator iterator;
        list = new ProductList(products);
        iterator = list.createIterator();

        System.out.println("正向遍历: ");
        while (!iterator.isLast()){
            System.out.print(iterator.getNextItem()+",");
            iterator.next();
        }
        System.out.println();
        System.out.println("------------------");
        System.out.println("逆向遍历: ");
        while (!iterator.isFirst()){
            System.out.print(iterator.getPreviousItem()+", ");
            iterator.previous();
        }

    }
}
